package learn.stream;

import java.util.concurrent.ForkJoinPool;
import java.util.stream.IntStream;

/**
 * Created By  醉美柳舞之众星捧月
 *
 * @author song
 * @date 2018/12/27 17:03
 */
public class StreamDemo5 {
    public static void main(String[] args) {

        /** 1. 常规普通 并行流  **/
//        /** 调用parallel 产生一个 并行流 **/
//        IntStream.range(1, 100).parallel().peek(StreamDemo5::debug).count();


        /**  2. 先并行 再串行的场景 **/
        // 现在要实现一个效果：先并行,再串行
        // 多次调用 parallel / sequential , 以最后一次调用为准
        // IntStream.range(1,100);
        //调用parallel产生并行流
        // .parallel().peek(StreamDemo5::debug)
        // sequential 产生串行流
        // .sequential().peek(StreamDemo5::debug2)
        // .count();

        /** 3. 使用线程, 默认是 系统默认的线程 **/

        /** 并行流使用的线程池： ForkJoinPool.commonPool **/
        /** 默认的线程数是 当前机器的CPU个数 **/
        /** 使用这个属性可以修改默认的线程数 **/
        System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "20");


        /**
         * 4. 自定义选择线程池
         */

        /** 并行流式用的系统默认的同一个线程池 **/
        /** 使用自己的线程池,不使用默认线程池,防止任务被阻塞 **/
        ForkJoinPool pool = new ForkJoinPool(20);
        pool.submit(() -> IntStream.range(1, 100).parallel().peek(StreamDemo5::debug).count());
        pool.shutdown();
        synchronized (pool) {
            try {
                pool.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void debug(int i) {
        System.out.println("debug" + i);
        System.out.println(Thread.currentThread().getName() + "debug" + i);

    }
}
